/*
 * SDK连接相关
 */

import config from '@/configs'
import pageUtil from '@/utils/page'
import util from '@/utils'

import store from '../'
import { onRobots } from './robots'
import { onMyInfo } from './userInfo'
import { onSessions, onUpdateSession } from './session'
import { onRoamingMsgs, onOfflineMsgs, onMsg } from './msgs'

const SDK = require('@/sdk/' + config.sdk)

// 重新初始化 NIM SDK
export function initNimSDK ({ state, commit, dispatch }, loginInfo) {
  if (state.nim) {
    state.nim.disconnect()
  }
  dispatch('showLoading')
  // 初始化SDK
  window.nim = state.nim = SDK.NIM.getInstance({
    // debug: true,
    appKey: config.appkey,
    // 获取用户名或token
    account: loginInfo.uid,
    token: loginInfo.sdktoken,
    db: false,
    syncSessionUnread: true,
    syncRobots: true,
    autoMarkRead: true, // 默认为true
    onconnect: function onConnect () {
      commit('updatepUserInfo', loginInfo)
      // 获取用户列表后，将参数传进来
      // if (sessionStorage.getItem('subscribeList')) {
      //   const subscribeList = JSON.parse(sessionStorage.getItem('subscribeList'))
      //   onaddsubscribe(subscribeList)
      // }
    },
    onerror: function onError (event) {
      pageUtil.turnPage('连接失败，请退出重新登录', '/')
    },
    ondisconnect: function onDisconnect (error) {
      switch (error.code) {
        // 账号或者密码错误, 请跳转到登录页面并提示错误
        case 302:
          pageUtil.turnPage('当前账号失去连接，请退出重新连接', '/')
          break
        // 被踢, 请提示错误后跳转到登录页面
        case 'kicked':
          const map = {
            PC: '电脑版',
            Web: '网页版',
            Android: '手机版',
            iOS: '手机版',
            WindowsPhone: '手机版'
          }
          const str = error.from
          const errorMsg = `你的帐号于${util.formatDate(new Date())}被${(map[str] || '其他端')}踢出下线，请确定帐号信息安全!`
          pageUtil.turnPage(errorMsg, '/')
          break
        default:
          break
      }
    },
    // 机器人
    onrobots: onRobots,
    // 用户名片 - actions/userInfo
    onupdatemyinfo: onMyInfo,
    // // 会话
    onsessions: onSessions,
    onupdatesession: onUpdateSession,
    // onhistoryMsg: onHistoryMsg,
    // // 消息
    onroamingmsgs: onRoamingMsgs,
    onofflinemsgs: onOfflineMsgs,
    onmsg: onMsg,
    // 服务器推送的订阅事件
    onpushevents: onPushEvents,
    // // 同步完成
    onsyncdone: function onSyncDone () {
      dispatch('hideLoading')
      // 说明在聊天列表页
      if (store.state.currSessionId) {
        dispatch('setCurrSession', store.state.currSessionId)
      }
    }
  })
  // 当订阅的对象改变状态的时候，从服务器获取订阅对象的信息
  function onPushEvents (param) {
    if (param.msgEvents) {
      // 拿到监听对象的状态
      const subscribeStatusList = []
      // 用来存放监听对象的字段
      const subscribeObject = {}
      param.msgEvents.forEach(data => {
        console.log(data)
        subscribeObject.account = data.account
        subscribeObject.value = data.value
        subscribeStatusList.push(subscribeObject)
      })
      sessionStorage.setItem('subscribeStatusList', JSON.stringify(subscribeStatusList))
    }
  }

  function onaddsubscribe (accountsList) {
    // 订阅用户的订阅函数
    nim.subscribeEvent({
      type: 1,
      // 真实的时候使用
      accounts: accountsList,
      subscribeTime: 70,
      sync: true,
      done: subscribeEventDone
    })
    function subscribeEventDone (error, obj) {
      console.log('订阅事件' + (!error ? '成功' : '失败'), error, obj)
  //     // 查询订阅列表
  //       // nim.querySubscribeEventsByAccounts({
  //       //   type: 1,
  //       //   // 真实的时候使用
  //       // // accounts: accountsList,
  //       // // 测试写死
  //       //   accounts: ['lcl', 'ly'],
  //       //   done: querySubscribeEventDone
  //       // })
  //       // function querySubscribeEventDone(error, obj) {
  //       //   console.log('获取订阅列表' + (!error ? '成功' : '失败'), error, obj)
  //       // }
    }
  }
}
